package com.atguigu.tingshu.common.util;

import lombok.extern.slf4j.Slf4j;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.springframework.util.StringUtils;

@Slf4j
public class PinYinUtils {


    public static void main(String[] args) {
        String str = "唐代诗人李白-libai";
        System.out.println(PinYinUtils.toHanyuPinyin(str));
        System.out.println(PinYinUtils.getFirstLetter(str));
    }

    /**
     * 汉字转拼音
     */
    public static String toHanyuPinyin(String hanzi) {
        if(StringUtils.isEmpty(hanzi)) {
            return "";
        }
        char[] chars = hanzi.trim().toCharArray();
        StringBuilder hanyupinyin = new StringBuilder(); // 建议使用 StringBuilder 提高性能

        //输出格式设置
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);

        // 中文的正则表达式
        String hanziRegex = "[\\u4E00-\\u9FA5]+";

        try {
            for (int i = 0; i < chars.length; i++) {
                // 判断为中文,则转换为汉语拼音
                if (String.valueOf(chars[i]).matches(hanziRegex)) {
                    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(chars[i], defaultFormat);
                    // 添加 null 检查
                    if (pinyinArray != null && pinyinArray.length > 0) {
                        hanyupinyin.append(pinyinArray[0]);
                    } else {
                        // 如果无法转换拼音，保留原字符
                        hanyupinyin.append(chars[i]);
                    }
                } else {
                    // 不为中文,则不转换
                    hanyupinyin.append(chars[i]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            log.error("字符不能转成汉语拼音", e);
        }

        return hanyupinyin.toString();
    }
    /**
     * 取汉字的第一个字符
     */
    /**
     * 取汉字的第一个字符
     */
    public static String getFirstLetter(String hanzi) {
        if(StringUtils.isEmpty(hanzi)) {
            return "";
        }
        char[] chars = hanzi.trim().toCharArray();
        StringBuilder firstPinyin = new StringBuilder();

        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        // 拼音小写
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        // 不带声调
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        try {
            for (int i = 0, len = chars.length; i < len; i++) {
                // 判断为汉字,则转为拼音,并取第一个字母
                if (Character.toString(chars[i]).matches("[\\u4E00-\\u9FA5]+")) {
                    String[] pys = PinyinHelper.toHanyuPinyinStringArray(chars[i], defaultFormat);
                    // 添加 null 检查，防止 NullPointerException
                    if (pys != null && pys.length > 0) {
                        firstPinyin.append(pys[0].charAt(0));
                    } else {
                        // 对于无法转换拼音的汉字，保留原字符
                        firstPinyin.append(chars[i]);
                    }
                } else {
                    // 非汉字字符直接保留
                    firstPinyin.append(chars[i]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            log.error("字符不能转为汉语拼音", e);
            // 发生异常时返回已处理的部分结果
            return firstPinyin.toString();
        }

        return firstPinyin.toString();
    }
}

